#include <stdio.h>

// 声明枚举类型enum Color
typedef enum Color Color;
enum Color { red, yellow, blue, white, black }; 

void printColor(Color color) {
    char *colorName[] = {"red", "yellow", "blue", "white", "black"};
    printf("%-10s", colorName[color]);
}

void printColors(Color colors[], int n) {
    for (int i = 0; i < n; i++) {
        printColor(colors[i]);
    }
    printf("\n");
}

// 判断颜色是否在数组中
int contains(Color colors[], int n, Color color) {
    for (int i = 0; i < n; i++) {
        if (colors[i] == color) {
            return 1;
        }
    }
    return 0;
}

// 递归实现
// selected: 已选颜色, total: 总共需要选几个颜色的球, idx: 当前选到第几个球
// 返回值: 符合条件的次数
int choiceColor(Color selected[], int total, int idx) {
    // 如果已经选完了
    if (idx >= total) {
        printColors(selected, total);
        return 1;
    }
    int count = 0;
    // 依次选择颜色
    for (int color = red; color <= black; color++) {
        // 如果颜色没有被选中
        if (!contains(selected, idx, color)) {
            // 选中颜色
            selected[idx] = color;
            // 递归选择下一个颜色
            count += choiceColor(selected, total, idx + 1);
        }
    }
    return count;
}

// lt9.8.c 的递归实现
int main() {
    Color selected[5];
    // 把参数中的 3 改为 4， 可以实现 4 个球的颜色组合
    int count = choiceColor(selected, 3, 0);
    printf("\ntotal:%5d\n", count);
    return 0;
}
